package br.com.tiespec.ejb.Ejb;

import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;

import br.com.tiespec.ejb.Dao.ClientePortalDAO;
import br.com.tiespec.ejb.Dao.UsuarioDAO;
import br.com.tiespec.ejb.EjbInterface.AprovacaoClientePortalInterface;
import br.com.tiespec.ejb.Util.MensagemUtil;
import br.com.tiespec.model.Enum.SituClientePortal;
import br.com.tiespec.model.Enum.SituUsuario;
import br.com.tiespec.model.Enum.TipoSortOrder;
import br.com.tiespec.model.Modelo.ClientePortal;
import br.com.tiespec.model.Modelo.Usuario;
import br.com.tiespec.model.Util.CriptoHashUtil;
import br.com.tiespec.model.Util.EmailUtil;
import br.com.tiespec.model.Util.RNException;

@Stateless(mappedName = "AprovacaoClientePortalImpl")
@Local(value=AprovacaoClientePortalInterface.class)
public class AprovacaoClientePortalImpl implements AprovacaoClientePortalInterface {

	private static final long serialVersionUID = 1L;
	
	@EJB private ClientePortalDAO cpDao;
	@EJB private UsuarioDAO uDao;
	
	@Override
	public List<ClientePortal> listarClientePortal(int first, int pageSize,
			String sortField, TipoSortOrder sortOrder, String varNome,
			String varUsuario, Date varCadastroDe, Date varCadastroAte)
			throws RNException {
		return cpDao.listarPendenteAprovacao(first, pageSize, sortField, sortOrder, 
				varNome, varUsuario, varCadastroDe, varCadastroAte);
	}

	@Override
	public Integer countClientePortal(String varNome, String varUsuario,
			Date varCadastroDe, Date varCadastroAte) throws RNException {
		return cpDao.countPendenteAprovacao(varNome, varUsuario, varCadastroDe, varCadastroAte);
	}

	@Override
	public void aprovarClientePortal(Long id) throws RNException {
		try {
			ClientePortal cpInstance = cpDao.selecionarComResponsavel(id);
			Usuario uInstance = cpInstance.getResponsavel();
			
			cpInstance.setSituacao(SituClientePortal.ATIVO);
			cpInstance.setDataAprovacao(new Date());
			
			String senhaUsuario = this.gerarSenha();
			uInstance.setSenha(CriptoHashUtil.hash("SHA1", senhaUsuario));
			uInstance.setSituacao(SituUsuario.ATIVO);
			
			enviarEmailAprovacao(uInstance.getEmail(), senhaUsuario);
			
			cpDao.update(cpInstance);
			uDao.update(uInstance);
			
		} catch (Exception e){
			e.printStackTrace();
			throw new RNException(e);
		}
	}

	@Override
	public ClientePortal selecionarClientePortal(Long id) throws RNException {
		return cpDao.selecionar(id);
	}

	@Override
	public ClientePortal selecionarClientePortalComResponsavel(Long id)
			throws RNException {
		return cpDao.selecionarComResponsavel(id);
	}

	@Override
	public ClientePortal selecionarClientePortalComUsuarios(Long id)
			throws RNException {
		return cpDao.selecionarComUsuarios(id);
	}
	
	private String gerarSenha(){
		String senha = "";
		int random;
		boolean v = false;
		for(int i = 0; i<8; i++) {
			v = false;
			do {
				random = (int) (Math.random() * 122);
				if (random >= 48 && random <= 57)
					v = true;
				else if (random >= 97 && random <= 122)
					v = true;
				else if (random >= 65 && random <= 90)
					v = true;
			} while (!v);
			senha += ((char) random);
		}
		return senha;
	}
	
	private void enviarEmailAprovacao(String email, String senha) {
		String msg = MensagemUtil.getMsg("EmailAprovacaoClientePortal_Mensagem", email, senha);
		try {
			EmailUtil mail = new EmailUtil();
			mail.setTitulo(MensagemUtil.getMsg("EmailAprovacaoClientePortal_Titulo"));
			mail.setMensagem(msg);
			mail.adicionarDestinatario(email);
			mail.send();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}